﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <vector>
#include <list>
using namespace std;

/*
* vector构造函数
*vector<T> v;//采用模板实现类实现，默认构造函数
*vector(v.begin(), v.end());//将 v[begin(), end())区间中的元素拷贝给本身
*vector(n, elem);//构造函数将n个elem拷贝给自身
*vector(const vector &vec);//拷贝构造函数
*
* 例子：使用vector构造函数，我们可以...
* int arr[] = {2,3,4,1,9};
* vector<int> v1(arr , arr + sizeof(arr) / sizeof(int));
*
* vector常用赋值操作
* assign(begin, end);//将[begin(), end())区间中的数据拷贝赋值给本身
* assign(n, elem);//将n个elem拷贝赋值给本身
* vector& operator=(const vector &vec);//重载等号运算符
* swap(vec);//将vec与本身的元素互换
*
* vector大小操作
* size();//返回容器中元素的个数
* empty();//判断容器是否为空
* resize(int num);//重新指定容器的长度为num，若容器变长，则以默认值填充新位置；若容器变短，则末尾超出的元素将被删除
* resize(int num, elem);//重新指定容器的长度为num，若容器变长，则以elem值填充新位置；若容器变短，则末尾超出长度的元素将被删除
* capacity();//容器的容量
* reserve(int len);//容器预留len个元素长度，预留位置不初始化，因此不可访问
*/
/*
* vector数据存取：
* at(int idx);//返回索引idx所指的数据；如果idx越界，抛出out_of_range异常
* operator[];//返回索引idx所指的数据；越界时，运行直接报错
* front();//返回容器中第一个数据元素；
* back();//返回容器中最后一个数据元素.
*
* vector插入删除操作
* insert(const_iterator pos, elem);//从迭代器指向位置pos插入元素elem；
* push_back(elem);//尾部插入元素；
* pop_back();//尾部删除元素；
* insert(const_iterator pos, int count, ele);//迭代器指向位置pos并插入count个元素elem；
* erase(const_iterator pos);//删除迭代器指向的元素；
* erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素；
* clear();//删除容器中的所有元素；
*/
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void testVector()
{
	vector<int> v;
	for (int i = 0; i < 10; ++i)
	{
		v.push_back(i);
		//1.v.capacity()容器的容量；
		cout << v.capacity() << endl;//1,2,3,4,6,6,9,9,9,13
	}
	printVector(v);//0 1 2 3 4 5 6 7 8 9
	//12.逆序遍历；reverse_iterator，逆序迭代器；
	for (vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;//9 8 7 6 5 4 3 2 1 0

	//13.vector迭代器，是随机访问的迭代器，支持跳跃式访问；
	vector<int>::iterator itBegin = v.begin();
	itBegin = itBegin + 3;
	//14.如果上述写法不报错，这个迭代器是随机访问迭代器；

	list<int> l;
	for (int i = 0; i < 10; ++i)
	{
		l.push_back(i);
	}
	list<int>::iterator lIt = l.begin();
	lIt++;
	//15.list容器不支持随机访问；
	//lIt = lIt + 1;

	int arr[] = { 2,3,4,1,9 };
	vector<int> v1(arr, arr + sizeof(arr) / sizeof(int));

	vector<int> v2(v1.begin(), v1.end());
	printVector(v2);//2 3 4 1 9

	vector<int> v3(5, 99);
	printVector(v3);//99 99 99 99 99

	//2.赋值使用；
	vector<int> v4;
	v4.assign(v3.begin(), v3.end());
	printVector(v4);//99 99 99 99 99

	v4.swap(v2);
	cout << "v4与v2进行交换，交换后的v4为：" << endl;
	printVector(v4);//2 3 4 1 9

	cout << "v4容器的大小为：" << v4.size() << endl;//5
	if (v4.empty())
	{
		cout << "v4为空！" << endl;
	}
	else
	{
		cout << "v4不为空！" << endl;//v4不为空！
	}

	//v4 23419
	//3.第二个参数是默认值，默认为0；
	//v4.resize(10);
	v4.resize(10, -1);
	printVector(v4);//2 3 4 1 9 0 0 0 0 0 --> 2 3 4 1 9 -1 -1 -1 -1 -1

	v4.resize(3);
	printVector(v4);//2 3 4

	vector<int> vs;
	for (int i = 0; i < 100000; ++i)
	{
		vs.push_back(i);

	}
	cout << "vs的容量为：" << vs.capacity() << endl;//138255
	cout << "vs的大小为：" << vs.size() << endl;//100000

	vs.resize(3);
	cout << "vs的容量为：" << vs.capacity() << endl;//138255
	cout << "vs的大小为：" << vs.size() << endl;//3

	//4.巧用swap收缩空间;vector<int>(vs)利用vs初始化匿名对象；
	vector<int>(vs).swap(vs);
	cout << "vs的容量为：" << vs.capacity() << endl;//3
	cout << "vs的大小为：" << vs.size() << endl;//3

	//5.reserve(int len);//容器预留len个元素长度，预留位置不初始化，因此不可访问
	vector<int> vr;

	//7.预留100000空间；已知开辟100000，就在一开始开辟100000的空间；
	vr.reserve(100000);

	int* p = NULL;
	int num = 0;
	for (int i = 0; i < 100000; ++i)
	{
		vr.push_back(i);
		if (p != &vr[0])
		{
			p = &vr[0];
			num++;
		}
	}
	//6.开辟100000个数据，用的次数：
	cout << num << endl;//30 --> 1

	vector<int> vf;
	vf.push_back(10);
	vf.push_back(30);
	vf.push_back(20);
	vf.push_back(50);

	cout << "vf的首元素front：" << vf.front() << endl;//10
	cout << "vf的尾元素back：" << vf.back() << endl;//50

	//vf.insert(vf.begin(), 100);
	//8.参数1，迭代器；参数2，N个数；参数3，具体插入的内容；
	vf.insert(vf.begin(), 2, 100);
	printVector(vf);//100 10 30 20 50 --> 100 100 10 30 20 50

	//9.尾删；
	vf.pop_back();
	printVector(vf); //100 100 10 30 20

	//10.删除；
	vf.erase(vf.begin());
	printVector(vf);//100 10 30 20

	//11.清空所有数据；
	//vf.erase(vf.begin(), vf.end());
	vf.clear();
	if (vf.empty())
	{
		cout << "vf为空！" << endl;//vf为空！
	}

}

//main320：vector载体容器
int main320()
{
	testVector();

	system("pause");
	return EXIT_SUCCESS;
}